from rest_framework import serializers

from drfstudy.models import *


# 学生序列化器： 序列化与反序列化
# class StudentSerializer(serializers.Serializer):
#     id = serializers.CharField(label='ID', read_only=True)  # 只读
#     name = serializers.CharField(max_length=30, label='姓名')
#     age = serializers.IntegerField(label='年龄', required=False)  # 年龄可给不可给
#     sex = serializers.IntegerField(label='性别', required=False)
#     create_time = serializers.DateTimeField(label='创建时间', required=False)
#     update_time = serializers.DateTimeField(label='更新时间', required=False)
#     is_deleted = serializers.BooleanField(default=False, label='逻辑删除', required=False)
#
#     # 创建：写入模型数据
#     def create(self, validated_data):  # validated_data是字典，即表单的数据，{"name": "lzl","age": 18,"sex": true}
#         return Student.objects.create(**validated_data)  # **validated_data即拆包，把validated_data变成name='lzl',age=18
#
#     # 修改：修改模型数据
#     def update(self, instance, validated_data):
#         instance.name = validated_data.get('name', instance.name)
#         instance.age = validated_data.get('age', instance.age)
#         instance.sex = validated_data.get('sex', instance.sex)
#         instance.save()
#         return instance

# 学生的序列化器
class StudentSerializer(serializers.ModelSerializer):
    # 使用source引用其他模型中某个字段（）此处引用classes的name属性值
    class_name = serializers.CharField(source='classes.name', read_only=True)

    class Meta:
        model = Student  # 模型类===>自动匹配序列化字段
        # 指定映射哪些字段
        # 1、映射所有字段
        # fields = '__all__'
        # 2、映射指定字段
        # fields=['name','age','sex']
        # 3、不想映射某字段
        exclude = ['is_deleted']

        # 数据经验： age 年龄范围0-100之间
        extra_kwargs = {
            'age': {'min_value': 0, 'max_value': 100},
        }

    # 属性级别的校验
    # 校验name属性的是否合法
    def validate_name(self, data):
        # 假设用户名需要必须包含mq字符，
        if 'mq' not in data.lower():
            raise serializers.ValidationError('用户名需要包含mq字符')
        return data

    # 对象级别的校验
    def validate(self, data):  # data是获取所有表单数据，对象，字典
        if 'mq' not in data['name'].lower():
            raise serializers.ValidationError('用户名需要包含mq字符')
        if data['age'] < 18:
            raise serializers.ValidationError('未成年人禁止访问')
        return data

# 学生序列化器2
class StudentSerializerSimple(serializers.ModelSerializer):
    class Meta:
        model = Student  # 模型类===>自动匹配序列化字段
        # 指定映射哪些字段
        # 1、映射所有字段
        # fields = '__all__'
        # 2、映射指定字段
        fields = ['id', 'name', 'age', 'sex']
        # 3、不想映射某字段
        # exclude = ['is_deleted']


# 班级的序列化器
class ClassesSerializer(serializers.ModelSerializer):
    # 新增字段，嵌套序列化，所有数据
    student_set = StudentSerializerSimple(many=True, read_only=True)

    class Meta:
        model = Classes
        exclude = ['is_deleted']
